<?php 
defined('BASEPATH') OR exit('No direct script access allowed');
// +----------------------------------------------------------------------
// | 项目公共函数库
// +----------------------------------------------------------------------
// | Copyright (c) 2015
// +----------------------------------------------------------------------
// | Author: baiping 125618036@qq.com http://www.webipcode.com
// +----------------------------------------------------------------------
// | 2015-7-23下午6:41:22
// +----------------------------------------------------------------------

/**
 * 检测用户是否登录
 * @return integer 0-未登录，大于0-当前登录用户ID
 * @author Baip
 */
function is_login(){
	$ci = &get_instance();//获取CI 的全局超级对象
	$ci->load->library('session');
	$user = $ci->session->userdata('user_auth');
	if (empty($user)) {
		return 0;
	} else {
		return $ci->session->userdata('user_auth_sign') == data_auth_sign($user) ? $user['uid'] : 0;
	}
}

/**
 * 获取用户名
 * @param unknown_type $uid
 */
function getUsername($uid=0){
	if(!($uid && is_numeric($uid))){ //获取当前登录用户名
		$ci = &get_instance();//获取CI 的全局超级对象
		$ci->load->library('session');
        $userinfo = $ci->session->userdata('user_auth');
        return $userinfo['username'];
    }
	
}

/**
 * 检测验证码
 * @param unknown_type $code
 * @author Baip
 */
function check_verify($code){
	$ci = &get_instance();//获取CI 的全局超级对象
	$ci->load->library('session');
	$verify = $ci->session->userdata('code_verify');
	if ( $code != $verify ){
		return false;
	}
	return true;
}

/**
 * 密码加密
 * @param unknown_type $password
 * @param unknown_type $salt
 */
function encryption_pass($password, $salt){
	return md5(md5($password).$salt);
}

/**
 * 弹出框口提示页
 * @param string $status 状态（success/error）
 * @param string $msg 提示信息
 * @param string $tourl 跳转地址
 * @author Baip
 */
function show_message($status='success', $msg='操作成功', $tourl=''){
	$tourl = empty( $tourl ) ? selfurl() : $tourl;
	$class_name = $status == 'success' ? 'alert-success' : 'alert-danger';
	$msg_arr = array(
			'class_name'=>$class_name,
			'msg_title' => $msg,
			'tourl'=> $tourl
	);
	$ci = &get_instance();//获取CI 的全局超级对象
	$ci->load->view('showmsg/show_message', $msg_arr);
}
/**
 * 系统加密方法
 * @param string $data 要加密的字符串
 * @param string $key  加密密钥
 * @param int $expire  过期时间 单位 秒
 * @return string
 */
function codeiginter_encrypt($data, $key = '', $expire = 0) {
	$key  = md5(empty($key) ? DATA_AUTH_KEY : $key);
	$data = base64_encode($data);
	$x    = 0;
	$len  = strlen($data);
	$l    = strlen($key);
	$char = '';

	for ($i = 0; $i < $len; $i++) {
		if ($x == $l) $x = 0;
		$char .= substr($key, $x, 1);
		$x++;
	}

	$str = sprintf('%010d', $expire ? $expire + time():0);

	for ($i = 0; $i < $len; $i++) {
		$str .= chr(ord(substr($data, $i, 1)) + (ord(substr($char, $i, 1)))%256);
	}
	return str_replace(array('+','/','='),array('-','_',''),base64_encode($str));
}

/**
 * 系统解密方法
 * @param  string $data 要解密的字符串 （必须是think_encrypt方法加密的字符串）
 * @param  string $key  加密密钥
 * @return string
 */
function codeiginter_decrypt($data, $key = ''){
	$key    = md5(empty($key) ? DATA_AUTH_KEY : $key);
	$data   = str_replace(array('-','_'),array('+','/'),$data);
	$mod4   = strlen($data) % 4;
	if ($mod4) {
		$data .= substr('====', $mod4);
	}
	$data   = base64_decode($data);
	$expire = substr($data,0,10);
	$data   = substr($data,10);

	if($expire > 0 && $expire < time()) {
		return '';
	}
	$x      = 0;
	$len    = strlen($data);
	$l      = strlen($key);
	$char   = $str = '';

	for ($i = 0; $i < $len; $i++) {
		if ($x == $l) $x = 0;
		$char .= substr($key, $x, 1);
		$x++;
	}

	for ($i = 0; $i < $len; $i++) {
		if (ord(substr($data, $i, 1))<ord(substr($char, $i, 1))) {
			$str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
		}else{
			$str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
		}
	}
	return base64_decode($str);
}

/**
 * 数据签名认证
 * @param  array  $data 被认证的数据
 * @return string       签名
 */
function data_auth_sign($data) {
	//数据类型检测
	if(!is_array($data)){
		$data = (array)$data;
	}
	ksort($data); //排序
	$code = http_build_query($data); //url编码并生成query字符串
	$sign = sha1($code); //生成签名
	return $sign;
}
/**
 * 检测是否为数组
 * @param unknown_type $arr
 */
function my_is_array($arr){
	if ( !is_array( $arr ) ){
		return false;
	}
	return true;
}

/**
 * 返回分页配置项
 * @param int $site_url　分页的链接
 * @param int $total　总记录数
 * @param int $page_size 每页的记录数
 * @param int $uri_segment 获取url地址中的第几段为分页值
 * @param int $suffix 当有条件搜索的时候要在url中把搜索值传递的时候可以在这里设置如/aaa/bbb/那么url变为:/控制器/方法/页码/aaa/bbb
 * @param booler $use_page_number 分页的数据显示为页码还是数据集的偏移量
 * @param booler $num_links 分页输出的数据当前页码前面和后台链接的数默认为2如:123如果为5 12345
 * @param string $first_name 第一页名称
 * @param string $next_name　下一页名称
 * @param string $last_name　最后一页名称
 */
function get_page_config($site_url,$total, $page_size, $uri_segment='3', $suffix="", $first_url='', $num_links =3, $use_page_number = true,$first_name ='第一页', $prev_name='<', $next_name='>', $last_name='最后一页'){
	$config['base_url'] = $site_url;//分页链接
	$config['total_rows'] = $total;
	$config['per_page'] = $page_size;
	$config['num_links'] = $num_links;//分页输出的数据当前页码前面和后台链接的数默认为2如:123如果为5 12345
	$config['suffix'] = $suffix;//当有条件搜索的时候要在url中把搜索值传递的时候可以在这里设置如/aaa/bbb/那么url变为:/控制器/方法/页码/aaa/bbb
	$config['first_url'] = $first_url;
	$config['first_link'] = '首页';
	$config['uri_segment'] = $uri_segment;
	//自定义起始链接
	$config['first_link'] = $first_name;
	$config['first_tag_open'] = '<li>';
	$config['first_tag_close'] = '</li>';
	
	//自定义“上一页”链接
	$config['prev_link'] = $prev_name;
	$config['prev_tag_open'] = "<li>";
	$config['prev_tag_close'] = "</li>";
	
	//自定义结束链接，最后一页链接
	$config['last_link'] = $last_name;
	$config['last_tag_open'] ='<li>';
	$config['last_tag_close'] = '</li>';
	//自定义“数字”链接
	$config['num_tag_open']  = '<li>';
	$config['num_tag_close'] = '</li>';
	//自定义“当前页”链接
	$config['cur_tag_open']	= '<li><span>';
	$config['cur_tag_close'] = '</span></li>';
	//自定义“下一页”链接
	$config['next_link'] = $next_name;
	$config['next_tag_open'] = '<li>';
	$config['next_tag_close'] = '</li>';
	$config['use_page_numbers'] = $use_page_number;//默认分页URL中是显示每页记录数,启用use_page_numbers后显示的是当前页码
// 	$config['page_query_string'] = TRUE;
	
	return $config;
}

/**
 * 浏览器友好的变量输出
 * @param mixed $var 变量
 * @param boolean $echo 是否输出 默认为True 如果为false 则返回输出字符串
 * @param string $label 标签 默认为空
 * @param boolean $strict 是否严谨 默认为true
 * @return void|string
 */
function dump($var, $echo=true, $label=null, $strict=true) {
	$label = ($label === null) ? '' : rtrim($label) . ' ';
	if (!$strict) {
		if (ini_get('html_errors')) {
			$output = print_r($var, true);
			$output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
		} else {
			$output = $label . print_r($var, true);
		}
	} else {
		ob_start();
		var_dump($var);
		$output = ob_get_clean();
		if (!extension_loaded('xdebug')) {
			$output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output);
			$output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
		}
	}
	if ($echo) {
		echo($output);
		return null;
	}else
		return $output;
}

/**
 * 获取当前自身url
 */
function selfurl(){
	return strip_tags($_SERVER['REQUEST_URI']);
}

/**
 * Ajax方式返回数据到客户端
 * @param unknown_type $stats
 * @param unknown_type $info
 * @param unknown_type $url
 */
function ajaxreturn($status=1, $info='操作成功', $url=''){
	$data ['info'] = $info;
	$data ['status'] = $status;
	$data ['url'] = $url;
	header ( 'Content-Type:application/json; charset=utf-8' );
	exit ( json_encode ( $data ) );
}

// 分析枚举类型配置值 格式 a:名称1,b:名称2
function parse_config_attr($string) {
	$array = preg_split('/[,;\r\n]+/', trim($string, ",;\r\n"));
	if(strpos($string,':')){
		$value  =   array();
		foreach ($array as $val) {
			list($k, $v) = explode(':', $val);
			$value[$k]   = $v;
		}
	}else{
		$value  =   $array;
	}
	return $value;
}

/**
 * 字符串截取，支持中文和其他编码
 * @static
 * @access public
 * @param string $str 需要转换的字符串
 * @param string $start 开始位置
 * @param string $length 截取长度
 * @param string $charset 编码格式
 * @param string $suffix 截断显示字符
 * @return string
 */
function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true) {
	if(function_exists("mb_substr"))
		$slice = mb_substr($str, $start, $length, $charset);
	elseif(function_exists('iconv_substr')) {
		$slice = iconv_substr($str,$start,$length,$charset);
		if(false === $slice) {
			$slice = '';
		}
	}else{
		$re['utf-8']   = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
		$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
		$re['gbk']    = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
		$re['big5']   = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
		preg_match_all($re[$charset], $str, $match);
		$slice = join("",array_slice($match[0], $start, $length));
	}
	return $suffix ? $slice.'...' : $slice;
}


//去除所有标准的HTML代码
function cutstr_html($string, $sublen){
  $string = strip_tags($string);
  $string = preg_replace ('/\n/is', '', $string);
  $string = preg_replace ('/ |　/is', '', $string);
  $string = preg_replace ('/&nbsp;/is', '', $string);
  preg_match_all("/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/", $string, $t_string);   
  if(count($t_string[0]) - 0 > $sublen) $string = join('', array_slice($t_string[0], 0, $sublen))."…";   
  else $string = join('', array_slice($t_string[0], 0, $sublen));
  return $string;
 }
//输入过滤 同时去除连续空白字符可参考扩展库的remove_xss
function get_replace_input($str,$rptype=0){
	$str = stripslashes($str);
	$str = htmlspecialchars($str);
	$str = get_replace_nb($str);
	return addslashes($str);
}
//去除换行
function get_replace_nr($str){
	$str = str_replace(array("<nr/>","<rr/>"),array("\n","\r"),$str);
	return trim($str);
}
//去除连续空格
function get_replace_nb($str){
	$str = str_replace("&nbsp;",' ',$str);
	$str = str_replace("　",' ',$str);
	$str = preg_replace("/[\r\n\t ]{1,}/",' ',$str);
	return trim($str);
}

/**
 * 格式化字节大小
 * @param  number $size      字节数
 * @param  string $delimiter 数字和单位分隔符
 * @return string            格式化后的带单位的大小
 */
function format_bytes($size, $delimiter = '') {
	$units = array('B', 'KB', 'MB', 'GB', 'TB', 'PB');
	for ($i = 0; $size >= 1024 && $i < 5; $i++) $size /= 1024;
	return round($size, 2) . $delimiter . $units[$i];
}
/**
 * 时间戳格式化
 * @param int $time
 * @return string 完整的时间显示
 */
function time_format($time = NULL,$format='Y-m-d H:i'){
	$time = $time === NULL ? NOW_TIME : intval($time);
	return date($format, $time);
}


/**
 * 把返回的数据集转换成Tree
 * @param array $list 要转换的数据集
 * @param string $pid parent标记字段
 * @param string $level level标记字段
 * @return array
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
function list_to_tree($list, $pk='id', $pid = 'pid', $child = '_child', $root = 0) {
	// 创建Tree
	$tree = array();
	if(is_array($list)) {
		// 创建基于主键的数组引用
		$refer = array();
		foreach ($list as $key => $data) {
			$refer[$data[$pk]] =& $list[$key];
		}
		foreach ($list as $key => $data) {
			// 判断是否存在parent
			$parentId =  $data[$pid];
			if ($root == $parentId) {
				$tree[] =& $list[$key];
			}else{
				if (isset($refer[$parentId])) {
					$parent =& $refer[$parentId];
					$parent[$child][] =& $list[$key];
				}
			}
		}
	}
	return $tree;
}

/**
 * 将list_to_tree的树还原成列表
 * @param  array $tree  原来的树
 * @param  string $child 孩子节点的键
 * @param  string $order 排序显示的键，一般是主键 升序排列
 * @param  array  $list  过渡用的中间数组，
 * @return array        返回排过序的列表数组
 * @author yangweijie <yangweijiester@gmail.com>
 */
function tree_to_list($tree, $child = '_child', $order='id', &$list = array()){
	if(is_array($tree)) {
		$refer = array();
		foreach ($tree as $key => $value) {
			$reffer = $value;
			if(isset($reffer[$child])){
				unset($reffer[$child]);
				tree_to_list($value[$child], $child, $order, $list);
			}
			$list[] = $reffer;
		}
		$list = list_sort_by($list, $order, $sortby='asc');
	}
	return $list;
}

/**
 * 对查询结果集进行排序
 * @access public
 * @param array $list 查询结果
 * @param string $field 排序的字段名
 * @param array $sortby 排序类型
 * asc正向排序 desc逆向排序 nat自然排序
 * @return array
 */
function list_sort_by($list,$field, $sortby='asc') {
	if(is_array($list)){
		$refer = $resultSet = array();
		foreach ($list as $i => $data)
			$refer[$i] = &$data[$field];
		switch ($sortby) {
			case 'asc': // 正向排序
				asort($refer);
				break;
			case 'desc':// 逆向排序
				arsort($refer);
				break;
			case 'nat': // 自然排序
				natcasesort($refer);
				break;
		}
		foreach ( $refer as $key=> $val)
			$resultSet[] = &$list[$key];
		return $resultSet;
	}
	return false;
}

/**
 * 为了兼容php低版本的数组函数array_column,新增自定认函数
 * @param array $input 需要取出数组列的多维数组（或结果集）
 * @param unknown_type $columnKey 需要返回值的列，它可以是索引数组的列索引，或者是关联数组的列的键。 也可以是NULL
 * @param unknown_type $indexKey 作为返回数组的索引/键的列，它可以是该列的整数索引，或者字符串键值。
 */
function i_array_column($input, $columnKey, $indexKey=null){
	if (! function_exists ( 'array_column' )) {
		$columnKeyIsNumber = (is_numeric ( $columnKey )) ? true : false;
		$indexKeyIsNull = (is_null ( $indexKey )) ? true : false;
		$indexKeyIsNumber = (is_numeric ( $indexKey )) ? true : false;
		$result = array ();
		foreach ( ( array ) $input as $key => $row ) {
			if ($columnKeyIsNumber) {
				$tmp = array_slice ( $row, $columnKey, 1 );
				$tmp = (is_array ( $tmp ) && ! empty ( $tmp )) ? current ( $tmp ) : null;
			} else {
				$tmp = isset ( $row [$columnKey] ) ? $row [$columnKey] : null;
			}
			if (! $indexKeyIsNull) {
				if ($indexKeyIsNumber) {
					$key = array_slice ( $row, $indexKey, 1 );
					$key = (is_array ( $key ) && ! empty ( $key )) ? current ( $key ) : null;
					$key = is_null ( $key ) ? 0 : $key;
				} else {
					$key = isset ( $row [$indexKey] ) ? $row [$indexKey] : 0;
				}
			}
			$result [$key] = $tmp;
		}
		return $result;
	} else {
		return array_column ( $input, $columnKey, $indexKey );
	}
}

/**
 * 改变默认值
 * @param unknown_type $defaults
 * @param unknown_type $options
 */
function _default($defaults, $options){
	return array_merge($defaults, $options);
}

/**
 * 检测是否为必选字段
 * @param unknown_type $required
 * @param unknown_type $data
 * @return boolean
 */
function _required($required, $data){
	foreach($required as $field){
		if(!isset($data[$field])){
			return false;
		}
	}
	return true;
}

/**
 * 将数据中元素值转为下标
 * @param array $array 被转数组
 * @param string $field 数组元素的下标
 */
function changeArr($array, $field){
	$new_arr = array();
	foreach ( $array as $val ){
		$new_arr[$val[$field]] = $val;
	}
	return $new_arr;
}

/**
 * @author baiping 125618036@qq.com
 * @param str $url post传递的url地址
 * @param array $data 传递的数据
 * @return string
 */
function postCurl($url,$data){
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_URL,$url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);//把CRUL获取的内容赋值到变量,不直接输出的页面
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);//跟随$url重定向的页面
	curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
	ob_start();
	curl_exec($ch);
	$result = ob_get_contents() ;
	ob_end_clean();
	return $result;
}

/**
 * 获取远程地址的图片并保存到本地
 * @param string $url 远程完整的图片地址
 * @param string $filename 要存储的文件名称
 * @return boolean
 */
function getimg($url = "", $filename = "") {
	if(is_dir(basename($filename))) {
		return "此目录不成写";
		Return false;
	}
	//去除URL连接上面可能的引号
	$url = preg_replace( '/(?:^[\'"]+|[\'"\/]+$)/', '', $url );
	$hander = curl_init();
	$fp = fopen($filename,'wb');
	curl_setopt($hander,CURLOPT_URL,$url);
	curl_setopt($hander,CURLOPT_FILE,$fp);
	curl_setopt($hander,CURLOPT_HEADER,0);
	curl_setopt($hander,CURLOPT_FOLLOWLOCATION,1);
	//curl_setopt($hander,CURLOPT_RETURNTRANSFER,false);//以数据流的方式返回数据,当为false是直接显示出来
	curl_setopt($hander,CURLOPT_TIMEOUT,60);
	curl_exec($hander);
	curl_close($hander);
	fclose($fp);
	Return true;
}
/**
 * 根据时间返回时间状态
 * @param unknown_type $mytime
 */
function getTimeFormat($mytime) {
	$dif = time() - intval($mytime);
	if($dif < 60){//一分钟之内
		return '刚刚';
	}elseif($dif < 3600 && $dif > 0) { //一小时以内
		return intval($dif / 60) . '分钟前';
	}elseif($dif < 3600*24 && $dif >= 0) { //一天以内
		return intval($dif / 3600) . '小时前';
	}elseif($dif < 3600*24*5 && $dif >= 0) { //五天以内
		return intval($dif / (3600*24)) . '天前';
	}else {
		return date('Y-m-d', $mytime);
	}
}

/**
 * 二维数组排序
 * @param unknown_type $arr
 * @param unknown_type $keys
 * @param unknown_type $type
 * @return multitype:unknown
 */
function array_sort($arr,$keys,$type='asc', $isg2u=0){
	$keysvalue = $new_array = array();
	foreach ($arr as $k=>$v){
		$keysvalue[$k] = $v[$keys];
	}
	if($type == 'asc'){
		asort($keysvalue);
	}else{
		arsort($keysvalue);
	}
	reset($keysvalue);
	foreach ($keysvalue as $k=>$v){
		$new_array[] = $arr[$k];//$new_array[$k] = $arr[$k];加$k下标就是原来的，不加下标就重新排了；
		if ( $isg2u == 1 ){
			g2u($v);
		}
	}
	return $new_array;
}

/**
 * 检测是否为空
 * @param 检测的字符串 $str
 * @return boolean
 */
function checkEmpty($str){
	if ( empty( $str ) || !isset( $str ) ){
		return false;
	}else{
		return true;
	}
}

/**
 *非空验证
 * @param	string	$value	需要验证的值
 * @param	string	$msg	验证失败的提示消息
 */
function notnull($value) {
	if(strlen(trim($value))==0) {
		return false;
	}else{
		return true;
	}
}

/**
 * 检测中文字符串是否达到系统要求的长度
 * @param 被检测的字符串 $str
 * @param 额定长度  $strlen
 */
function checkChineseLen($str, $strlen=2){
	if ( utf8_strlen($str) < $strlen ){
		return false;
	}else{
		return true;
	}
}
/**
 *数字格式验证
 * @param	string	$value	需要验证的值
 * @param	string	$msg	验证失败的提示消息
 */
function isnumber($value) {
	$rules='/^\d+$/';
	if(!preg_match($rules, $value)) {
		return false;
	}else{
		return true;
	}
}
/**
 * 货币格式验证
 * @param	string	$value	需要验证的值
 * @param	string	$msg	验证失败的提示消息
 */
function currency($value, $msg) {
	$rules='/^\d+(\.\d+)?$/';
	if(!preg_match($rules, $value)) {
		return false;
	}else{
		return true;
	}
}

/**
 * url地址验证验证
 * @param	string	$value	需要验证的值
 */
function check_url($url){
	if(!preg_match('/(http|https):\/\/[\w.]+[\w\/]*[\w.]*\??[\w=&\+\%]*/is',$url)){
		return false;
	}else{
		return true;
	}
}
/**
 * 将邮箱地址中间位置替成*
 * @param unknown_type $email
 * @return mixed
 */
function repalceMailHide($email){
	$emailadd = explode("@", $email);
	$email_len = strlen($emailadd[0]);
	$email_jiami = substr($emailadd[0], 1,($email_len-2));
	$email_mi = str_replace($email_jiami,"***",$email);
	return $email_mi;
}
/**
 * 将手机中间位置替换成*
 * @param unknown_type $mobilenum
 * @return mixed
 */
function replaceMobileHide($mobilenum){
	$mobile_num = preg_replace('#(\d{3})\d{5}(\d{3})#', '${1}*****${2}', $mobilenum);
	return$mobile_num;
}
/**
 * 验证用户名是否为英文、数字、汉字
 * @param unknown_type $member_name
 * @return number
 */
function check_user($member_name,$minLen=4, $maxLen=20, $charset='ALL'){
	if(empty($member_name))
		return false;
	switch($charset){
		case 'EN': $match = '/^[_\w\d]{'.$minLen.','.$maxLen.'}$/iu';
		break;
		case 'CN':$match = '/^[_\x{4e00}-\x{9fa5}\d]{'.$minLen.','.$maxLen.'}$/iu';
		break;
		default:$match = '/^[_\w\d\x{4e00}-\x{9fa5}]{'.$minLen.','.$maxLen.'}$/iu';
	}
	if(preg_match($match,$member_name) ){
		return true;
	}else{
		return false;
	}
}
/**
 * 验证密码
 * @param unknown_type $value
 * @param unknown_type $minLen
 * @param unknown_type $maxLen
 * @return boolean|number
 */
function checkPwd($value,$minLen=6,$maxLen=18){
	$match='/^[\\~!@#$%^&*()-_=+|{}\[\],.?\/:;\'\"\d\w]{'.$minLen.','.$maxLen.'}$/';
	$v = trim($value);
	if(empty($v)){
		return false;
	}
	if(preg_match($match,$v)){
		return true;
	}else{
		return false;
	}
}
/**
 * 验证手机号
 */
function check_mobile($mobilephone){
	//手机号码的正则验证
	if(preg_match("/^13[0-9]{1}[0-9]{8}$|15[012356789]{1}[0-9]{8}$|18[0-9]{1}[0-9]{8}$|170[059]{1}[0-9]{7}/",$mobilephone)){
		return true;
	}else{
		return false;
	}
}
/**
 * 验证QQ
 * @param unknown_type $qqstr
 */
function check_qq($qqstr){
	$qq_reg = '/^[1-9]{1}[0-9]{4,11}$/';
	if (preg_match($qq_reg, $qqstr)){
		return true;
	}else{
		return false;
	}
}
/**
 * 验证固定电话
 */
function check_tel($tel){
	$tel_pattern = '/^(0?(([1-9]\d)|([3-9]\d{2}))-?)?\d{7,8}$/';
	if (preg_match($tel_pattern, $tel)){
		return true;
	}else{
		return false;
	}
}
/**
 * 验证邮箱
 */
function check_email($email){
	$chars = "/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i";
	if (strpos($email, '@') !== false && strpos($email, '.') !== false){
		if (preg_match($chars, $email)){
			return true;
		}else{
			return false;
		}
	}else{
		return false;
	}
}
/**
 * [unique_arr 将二维数组中的重复值去除]
 * @param  [type]  $array2D  [description]
 * @param  boolean $stkeep   [description]
 * @param  boolean $ndformat [description]
 * @return [type]            [description]
 */
function unique_arr($array2D,$stkeep=false,$ndformat=true){
	// 判断是否保留一级数组键 (一级数组键可以为非数字)
	if($stkeep) $stArr = array_keys($array2D);
	// 判断是否保留二级数组键 (所有二级数组键必须相同)
	if($ndformat) $ndArr = array_keys(end($array2D));
	//降维,也可以用implode,将一维数组转换为用逗号连接的字符串
	foreach ($array2D as $v){
		$v = join(",",$v);
		$temp[] = $v;
	}
	//去掉重复的字符串,也就是重复的一维数组
	$temp = array_unique($temp);
	//再将拆开的数组重新组装
	foreach ($temp as $k => $v){
		if($stkeep) $k = $stArr[$k];
		if($ndformat)
		{
			$tempArr = explode(",",$v);
			foreach($tempArr as $ndkey => $ndval) $output[$k][$ndArr[$ndkey]] = $ndval;
		}
		else $output[$k] = explode(",",$v);
	}
	return $output;
}
/**
 * [rebuild_array 将二维数组转成一维数组]
 * @param  [type] $arr [description]
 * @return [type]      [description]
 */
function rebuild_array($arr){  //rebuild a array
	static $tmp=array();
	foreach($arr as $key=>$val){
		if(is_array($val)){
			rebuild_array($val);
		}else{
			$tmp[] = $val;
		}
	}
	return $tmp;
}
/**
 * 通过汉字生成字母前缀
 * @param unknown_type $s0
 * @return unknown|string|number
 */
function get_letter($s0){
	$firstchar_ord = ord(strtoupper($s0{0}));
	if (($firstchar_ord>=65 and $firstchar_ord<=91)or($firstchar_ord>=48 and $firstchar_ord<=57)) return $s0{0};
	$s = iconv("UTF-8","gb2312", $s0);
	$asc = ord($s{0})*256+ord($s{1})-65536;
	if($asc>=-20319 and $asc<=-20284)return "A";
	if($asc>=-20283 and $asc<=-19776)return "B";
	if($asc>=-19775 and $asc<=-19219)return "C";
	if($asc>=-19218 and $asc<=-18711)return "D";
	if($asc>=-18710 and $asc<=-18527)return "E";
	if($asc>=-18526 and $asc<=-18240)return "F";
	if($asc>=-18239 and $asc<=-17923)return "G";
	if($asc>=-17922 and $asc<=-17418)return "H";
	if($asc>=-17417 and $asc<=-16475)return "J";
	if($asc>=-16474 and $asc<=-16213)return "K";
	if($asc>=-16212 and $asc<=-15641)return "L";
	if($asc>=-15640 and $asc<=-15166)return "M";
	if($asc>=-15165 and $asc<=-14923)return "N";
	if($asc>=-14922 and $asc<=-14915)return "O";
	if($asc>=-14914 and $asc<=-14631)return "P";
	if($asc>=-14630 and $asc<=-14150)return "Q";
	if($asc>=-14149 and $asc<=-14091)return "R";
	if($asc>=-14090 and $asc<=-13319)return "S";
	if($asc>=-13318 and $asc<=-12839)return "T";
	if($asc>=-12838 and $asc<=-12557)return "W";
	if($asc>=-12556 and $asc<=-11848)return "X";
	if($asc>=-11847 and $asc<=-11056)return "Y";
	if($asc>=-11055 and $asc<=-10247)return "Z";
	return 0;
}